﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using Djs.Games.DeskGame.GameComponents;
using Djs.WinForm.Components;

namespace Djs.Games.DeskGame.GameDefinitions
{
    /// <summary>
    /// GameRand : třída, která představuje generátor čísel pro hru na náhodu.
    /// </summary>
    public class GameRand : IItem
    {
        #region Vlastník
        /// <summary>
        /// Vlastník = hrací plocha.
        /// Skrze vlastníka může každé políčko dohledávat své sousedy.
        /// </summary>
        public Game Owner { get; set; }
        #endregion
        #region Logické a vizuální souřadnice (Center, Size, Bounds)
        /// <summary>
        /// Souřadnice středu políčka, v logických souřadnicích
        /// </summary>
        public virtual PointF LogicalCenter
        {
            get { return this._LogicalCenter; }
            set { this._LogicalCenter = value; this._SetLogicalDimensions(); }
        }
        /// <summary>
        /// Rozměr políčka, v logických souřadnicích
        /// </summary>
        public virtual SizeF LogicalSize
        {
            get { return this._LogicalSize; }
            set { this._LogicalSize = value; this._SetLogicalDimensions(); }
        }
        /// <summary>
        /// Aktuální logické souřadnice buňky (dané hodnotami this.LogicalCenter a this.LogicalSize)
        /// </summary>
        public virtual RectangleF LogicalBounds
        {
            get { return this._LogicalBounds; }
            set { this._LogicalBounds = value; this._SetLogicalBound(); }
        }
        /// <summary>
        /// Souřadnice středu políčka, v vizuálních souřadnicích
        /// </summary>
        public virtual PointF VisualCenter
        {
            get { return this._VisualCenter; }
            set { this._VisualCenter = value; this._SetVisualDimensions(); }
        }
        /// <summary>
        /// Rozměr políčka, v vizuálních souřadnicích
        /// </summary>
        public virtual SizeF VisualSize
        {
            get { return this._VisualSize; }
            set { this._VisualSize = value; this._SetVisualDimensions(); }
        }
        /// <summary>
        /// Aktuální vizuální souřadnice buňky (dané hodnotami this.VisualCenter a this.VisualSize)
        /// </summary>
        public virtual RectangleF VisualBounds
        {
            get { return this._VisualBounds; }
            set { this._VisualBounds = value; this._SetVisualBound(); }
        }
        /// <summary>
        /// Převede svoje logické souřadnice na fyzické, s použitém předaného transformačního objektu
        /// </summary>
        /// <param name="transformBound"></param>
        public void TransformLogicalToVisual(TransformBound transformBound)
        {
            this.VisualBounds = transformBound.TransformLogicalToVisual(this.LogicalBounds);
        }
        private void _SetLogicalDimensions()
        {
            this._LogicalBounds = this._LogicalCenter.FromCenter(this._LogicalSize);
        }
        private void _SetLogicalBound()
        {
            this._LogicalCenter = this._LogicalBounds.Center();
            this._LogicalSize = this._LogicalBounds.Size;
        }
        private void _SetVisualDimensions()
        {
            this._VisualBounds = this._VisualCenter.FromCenter(this._VisualSize);
        }
        private void _SetVisualBound()
        {
            this._VisualCenter = this._VisualBounds.Center();
            this._VisualSize = this._VisualBounds.Size;
        }
        private PointF _LogicalCenter;
        private SizeF _LogicalSize;
        private RectangleF _LogicalBounds;
        private PointF _VisualCenter;
        private SizeF _VisualSize;
        private RectangleF _VisualBounds;
        #endregion
        #region Specifické property a metody
        /// <summary>
        /// Viditelnost prvku
        /// </summary>
        public bool Visible { get; set; }
        
        #endregion
        #region Kreslení
        protected virtual void Paint(GameArea gameArea, Graphics graphics)
        {
            graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            graphics.FillEllipse(Brushes.LightSlateGray, this.VisualBounds);
        }
        #endregion
        #region Interaktivita
        protected virtual bool IsOnPoint(PointF visualPoint)
        {
            return false;
        }
        protected virtual bool EnableAction(ActionType action)
        {
            switch (action)
            {
                case ActionType.Paint: return this.Visible;
            }
            return false;
        }
        protected virtual bool RunAction(ActionType action, PointF visualCenter)
        {
            return false;
        }
        #endregion
        #region IItem Members
        int IItem.VisualLayer { get { return 2; } }
        PointF IItem.VisualCenter { get { return this.VisualCenter; } }
        void IItem.Paint(GameArea gameArea, Graphics graphics)
        {
            this.Paint(gameArea, graphics);
        }
        bool IItem.IsOnPoint(PointF visualPoint)
        {
            return this.IsOnPoint(visualPoint);
        }
        bool IItem.EnableAction(ActionType action)
        {
            return this.EnableAction(action);
        }
        bool IItem.RunAction(ActionType action, PointF visualCenter)
        {
            return this.RunAction(action, visualCenter);
        }
        #endregion
    }
}
